package day3.duotai;
//多态-->对象的多态和行为的多态.发生的前提是 在继承情况下的一种现象，父类指向子类，存在方法重写.不可以实现子类的独特功能只能实现重写的
public class duotai
{
    public static void main(String []args)
    {

        animal a1=new wolf();//对象的多态         父类--->子类
        a1.run();//方法(行为)是编译看左边（animal类里面必须有run方法），运行看右边（找真正的类）  要找真实的对象
        System.out.println(a1.name);//成员变量不具有多态性

        animal a2=new tortoise();
        a2.run();

       //无法实现a2.shrinkhead因为这个方法不是重写的，父类没有
        //需要强制转换
        //tortoise t1=(tortoise)a2;//大范围转小范围，强制转换，之后t1就接收到了
       // t1.shrinkhead();
        /*注意
                      animal a1=new tortoise();
                      wolf w1 =(wolf) a1;会运行出错，编译不报错因为只要符合继承就能强转

         */
        go(a2);

    }

    public static void go(animal res)
    {
            if(res instanceof wolf)//返回bool类型，看父类是否指向具体的某一个子类，强转前建议用
            {
               wolf w1 =(wolf)res;
               w1.eat();

            }
            else if(res instanceof tortoise)

            {
                tortoise t1=(tortoise)res;
                 t1.shrinkhead();
            }
            return;
    }
}
class animal
{
    String name="动物";
    public void run()
    {
        System.out.println("动物跑步");
    }
}
class tortoise extends animal
{
    String name="乌龟";
    @Override
    public void run()
    {
        System.out.println("乌龟跑的慢");
    }
    public void shrinkhead()
    {
        System.out.println("乌龟缩头");
    }
}
class wolf extends animal
{
    String name="狼";
    @Override
    public void run()
    {
        System.out.println("狼跑的快");
    }
    public void eat()
    {
        System.out.println("狼吃羊");
    }
}

